package com.shanzhe.eshop.common.hdfs.nameNode.server;

import lombok.Data;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * @Author yinwei
 * @create 2021/10/10
 * @Version 1.0
 * @desc 负责管理文件目录树组件
 */
public class FsDirectory {

    /**
     * 内存中的文件目录树
     */
    private INodeDirectory directoryChildren;


    public FsDirectory(){
        this.directoryChildren = new INodeDirectory("/");
    }

    /**
     * 创建目录
     * @param path 路径
     */
    public void mkdir(String path){
        //假设path = "/usr/warehouse/hive"
        //应该先判断下，"/"根目录下有没有"/usr"这个目录的存在
        //如果有的话，那么在判断"/usr"目录下有没有"/warehouse"目录的存在
        //如果说没有那么就创建一个"/warehouse"目录，挂在"/usr"目录下

        synchronized (directoryChildren){
            INodeDirectory parent = null;

            String[] paths = path.split("/");
            for(String splitPath:paths){
                if(splitPath.trim().equals("")){
                    continue;
                }
                INodeDirectory dir = (INodeDirectory) findINDirectory(directoryChildren,path);
                if(dir!=null){
                    parent = dir;
                    continue;
                }

                INodeDirectory child = new INodeDirectory(splitPath);
                parent.addChild(child);
            }
        }
    }


    /**
     * 对文件目录树递归查找
     * @param dir
     * @param path
     * @return
     */
    private INode findINDirectory(INodeDirectory dir, String path){

        if(dir.getChildren().size()==0){
            return null;
        }

        INodeDirectory iNode;

        for(INode child:dir.getChildren()){
         if(child instanceof INodeDirectory){
             if(((INodeDirectory) child).getPath().equals(path)){
                 return child;
             }
             iNode = (INodeDirectory) findINDirectory((INodeDirectory)child,path);
             if(iNode!=null){
                 return iNode;
             }
         }
        }
        return null;
    }

    /**
     * 代表的是文件目录树中的一个节点
     */
    private interface INode{



    }



    /**
     * 代表文件目录树的一个目录
     */
    @Data
    private class INodeDirectory implements INode{

        private String path;

        private List<INode> children;

        public INodeDirectory(String path){
            this.path = path;
            this.children = new LinkedList<INode>();
        }

        public void addChild(INode iNode){
            this.children.add(iNode);
        }
    }

    /**
     * 代表文件目录树中的一个文件
     */
    @Data
    public class INodeFile implements INode{

        /**
         * 文件名称
         */
        private String fileName;
    }
}
